package com.enzoism.springboot.dive.bis.arraylist;

import java.util.Arrays;
import java.util.Collection;

/**
 * 参考网址：https://mp.weixin.qq.com/s/GQgerZ79qKYukodqRKUo1g
 * 自己先想想一下，创建一个有序的List，如何实现？
 *
 * 【核心方法】
 * 1）add(E element)
 * 2）add(int index, E element)
 * 3）get()
 * 4）remove()
 * 5）remove(Object o)
 *
 * 【构造方法】
 * 1）ArrayList()
 * 2）ArrayList(int initialCapacity)
 * 3）ArrayList(Collection<? extends E> c)
 */
public class MyVectorList<E> {
    //一个空数组
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

    //实际存储元素的数组（transient：临时变量）
    transient Object[] elementData;

    // 初始化的size
    private int size;

    // 每次add/remove都会操作 modeCount++
    // 参考网址：https://www.cnblogs.com/zuochengsi-9/p/7050351.html
    protected transient int modCount = 0;

    // ---------------先实现3个构造函数
    public MyVectorList(){
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        size = 0;
    }
    public MyVectorList(int initialCapacity){
        // 简化代码逻辑，不对异常进行处理
        this.elementData = new Object[initialCapacity];;
        size = initialCapacity;
    }
    public MyVectorList(Collection<? extends E> c){
        Object[] a = c.toArray();
        size = a.length;
        if (size!=0){
            if (c.getClass().isInstance(Object[].class)){
                // 如果是数组，直接将对象赋值过来
                elementData = a;
            }else{
                //将集合元素拷贝成 Object[] 到 elementData
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        }else {
            //空元素
            elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        }
    }

    @Override
    public String toString() {
        return "MyArrayList{" +
                "elementData=" + Arrays.toString(elementData) +
                '}';
    }

    // 取消了异常的判断，直接返回数组的数据
    @SuppressWarnings("unchecked")
    public E get(int index) {
        return (E) elementData[index];
    }

    public static void main(String[] args) {
        // 创建0个
        MyVectorList myArrayList1 = new MyVectorList(0);
        System.out.println("-------->"+myArrayList1);
        // 创建5个
        MyVectorList myArrayList2 = new MyVectorList(5);
        System.out.println("-------->"+myArrayList2);
        // 创建Collection
        MyVectorList myArrayList3 = new MyVectorList(Arrays.asList("xiaoming1","xiaoming2"));
        System.out.println("-------->"+myArrayList3);

    }
}
